package com.ms.str;

/**
 * @author carter
 * create time    2018-08-14
 */
public class TestString {


    /**
     * 问题：
     * 1，内存中有几个对象 ？
     * 2，输出结果？
     *
     *
     * @param args
     */
    public static void main(String[] args) {

        //内存中有两个对象， s (引用) , abc （对象， new 生成出来的东西）
        // 1， abc  在String pool 里
        // 2， 堆 new 在堆里创建了一个对象
        // 3, 是一个引用 执行 new 生成的对象
        String s = new String("abc");

        //一个对象也没生成，String pool中已经存在， s2 引用直接指向
        String s1 = "abc";

        //生成了一个对象
        // s2指向了 生成的对象
        String s2 = new String("abc");


        // == 比较地址  基本类型比较字面值  false
        System.out.println("s == s1"+s == s1); //false
        System.out.println("s == s2"+s == s2); //false
        System.out.println("s1 == s2"+s1 == s2);//false


        System.out.println("============================");

        //intern 含义：返回一个字符串对象的一个标准标识
        System.out.println(s == s.intern());//false
        System.out.println(s1 == s1.intern());//true
        System.out.println(s.intern() == s2.intern());//true


        String hello = "hello";
        String hel = "hel";
        String lo = "lo";

        System.out.println("============================");

        //字面值相加 直接在常量池中组合获取
        //不都是字面值相加， 会在堆中生成一个新对象
        System.out.println(hello == "hel" +"lo");
        System.out.println(hello == "hel" + lo);


    }


}
